#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020/11/13 21:16
# @Author : youngchaolin

print()

# 什么是正则表达式
# 是一套规则，用来匹配字符串的
# 能做什么
# 1 能匹配字符串是否合法，在用户输入一个内容的时候，我们要提前要做检测
# 这样能够提高程序的效率，减轻服务器的压力，一般用在web开发项目，表单验证
# 2 能从一个大文件中，查找自己想要的内容，一般在日志分析/网络爬虫中用

# 正则规则
# 所有的规则中的字符就可以刚好匹配到字符串中的内容？没看明白

# 字符组 [] 描述的是一个位置上出现的所有可能性
'''
[abc] 一个中括号只表示一个字符位置，匹配a或b或c
[0-9] 区分数字，根据ASCII进行范围比对
[a-z] 区分小写，也是根据ASCII，a和z都有分别对应的ASCII码
[A-Z] 区分大写，也是根据ASCII，同上
[a-zA-Z] 区分大小写
[0-9a-z] 区分数字和小写字母
[0-9a-zA-Z] 区分数字，大小写字母

[0-9] -> \d  匹配数字
\w 匹配数字，字母和下划线
\s 匹配任意的空白符,如tab，enter产生的空白符
\t tab
\n enter
\W 非数字、字母和下划线
\D 非数字
\S 非空白符
[\d\D],[\w\W],[\s\S]表示匹配所有
. 表示匹配除了换行符之外的所有
\b 匹配单词的开始和结尾,如ing\b，可以匹配到eating searching等单词

[^] 非字符组
[^x] 匹配除了x之外的任意字符
[^\d] 匹配所有非数字
^ 匹配一个字符串的开始
$ 匹配一个字符串的结束

在正则表达式中能够帮助我们表示匹配内容的符号，都是正则中的元字符


a表达式|b表达式，会匹配a表达式或者b表达式，并且会优先匹配a表达式，匹配上了就不会再匹配
因此ab|abc，不如abc|ab，前者abc匹配不上，后者都可以匹配

www\.baidu\.com|www\.oldboy\.com可以匹配百度和老男孩，但是表达式写的太长了
除了www和com，只有中间更换，如果中间变化的部分想用或来匹配，应该如何处理呢？需要使用组

() 约束|描述的内容的范围问题
上面的情况，可以写成www\.(baidu|oldboy)\.com

'''

# 具体练习，可以在http://tool.chinaz.com/regex网址中测试

'''
量词，限定符
{n} 表示匹配n次
{n,} 表示匹配n次或以上
{n,m} 表示匹配n到m次
? 表示匹配0次或1次
+ 表示匹配1次或多次
* 表示匹配0次或多次
? + *覆盖范围的理解，可以用数学中的数轴来理解，?在[0,1]，+在[1,∞]，*在[0,∞]

'''

# 练习1 匹配整数 \d+
# 练习2 匹配小数 \d+\.\d+
# 练习3 匹配小数或整数  \d+\.?\d* --> \d+(\.\d+)?

# 匹配一个手机号码，以1开头，第二位是3-9，整体11位数
# ^1[3-9]\d{9}$

# 对比一下两种匹配
# 判断用户的输入是否合法，如果输入的对就能查到结果，不对就查不到结果
# ^1[3-9]\d{9}$
# 从一个大文件中查找符合规则的内容
# 1[3-9]\d{9}

'''
贪婪匹配：在尽量多的情况下匹配内容，用到了回溯算法
如\d{3,9}，一个数字会尽量多的匹配到9位
如\d{3,}6，会尽量匹配到最后一个6
.*x表示匹配任意字符任意次数，遇到最后一个x才停下

惰性匹配
如\d{3,}?6，会匹配到最近的一个6
如同样匹配13333，1(\d+)?3的结果是13333,1(\d+)??3的结果是13
惰性匹配的常见应用场景
.*?x表示匹配任意字符任意次数，一旦遇到x就停下


'''

'''
转义符
原本有特殊意义的字符，到了表达它本身字符意义的时候，就需要用到转义符
有一些有特殊意义的内容，放在字符组[]中，会取消它的特殊意义，如[.] [() ? + *]
[a\-z] -在字符组中如果不想用来表示范围，需要转义，或者字符组的最前面或最后面 
'''
